package com.ruoyi.common.utils.uuid;

import cn.hutool.core.util.RandomUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;

/**
 * ID生成器工具类
 *
 * @author ruoyi
 */
@Slf4j
public class IdUtils {
    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }


    /**
     * 先构造一个十进制的数字,
     * 前六位: 用户定义值cityCode,
     * 后13位: 为时间戳 (类似于这种形式1631238326627)
     * 然后将该数字转换为字符串
     * 再用36进制重新解析([0-9]|[a-z]), 数字和小写字母
     * 得到的字符串长度为11个字节
     * <p>
     * 10000000000000000 转化之后是: 2qgpckvng1s ; 也是11个字节
     * 99999999999999999 转化之后是: rcn1hssighr ; 也是11个字节
     *
     * @return 生成的字符串用作app_id, 是个15个字节的字符串
     */
    public static String generateAppIdCustom(String cityCode) {
        if (StringUtils.isBlank(cityCode) || cityCode.length() != 6) {
            log.error("编码失败！cityCode = {}", cityCode);
            return null;
        }
        final String s = cityCode + RandomUtil.randomInt(1000, 9999) + String.valueOf(System.currentTimeMillis());
        BigInteger n = new BigInteger(s, 10);
        // 转换成36进制, 得到的字符串长度15个字节
        return n.toString(36);
    }


    public static String generateAppKeyCustom(String phone) {
        if (StringUtils.isBlank(phone) || phone.length() != 11) {
            log.error("编码失败！cityCode = {}", phone);
            return null;
        }
        final String s = phone + String.valueOf(System.currentTimeMillis());
        BigInteger n = new BigInteger(s, 10);
        // 转换成36进制, 得到的字符串长度15个字节
        return n.toString(36);
    }


    public static void main(String[] args) {
        List<String> codes = Arrays.asList(
                "13110100123",
                "13120100123",
                "13130100123",
                "13130200123",
                "13130300123",
                "13130400123",
                "13712800123",
                "13810100123",
                "13810200123",
                "13810300123",
                "13820100123",
                "19982020012"
        );
        for (String code : codes) {
            System.out.println(generateAppKeyCustom(code));
        }
    }


}
